package org.shj.springcloud.movie;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.circuitbreaker.EnableCircuitBreaker;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;

/**
 * Hystrix 是熔断器，主要是 为了防止微服务雪崩效应。 主要通过以下几点实现延迟和容错
 * 1. 包裹请求。 使用 HystrixCommand （或 HystrixObservableCommand） 包裹对依赖的调用逻辑，每个命令在独立的线程中执行。
 * 2. 跳闸机制。 当某服务的错误率超过一定阈值时， Hystrix 可以自动或者手动跳闸，停止请示该服务一段时间。
 * 3. 资源隔离。 Hystrix 为每个依赖都维护了一个小型 的线程池（或者信号量），如果该线程池已满，发往该依赖的请求就被立即拒绝，而不是排除等候。
 * 4. 监控。 Hystrix 可以近乎实时地监控运行指标和配置的变化 。
 * 5. 回退机制。当请求失败、超时、被拒绝，或当断路器打开时，执行回退逻辑。回退逻辑可由开发人员自行提供，例如返回一个缺省值。
 * 6. 自我修复。断路器打开一段时间后，会自动进入“半开”状态。
 * 
 * 演示 Hystrix(断路器)的使用
 * 另外 Hystrix 还提供了统计功能，使用  http://localhost:9092/movie/hystrix.stream 进行访问， 以文本形式展示
 * micro-service-hystrix-dashboard 项目，使得上面的信息以更加友好的形式展示
 * 
 * @author huangjian
 *
 */


@SpringBootApplication
@EnableDiscoveryClient
@EnableCircuitBreaker  //启用断路器 //或者使用 @EnableHystrix 
public class MovieHystrixApplication {

	public static void main(String[] args) {
        SpringApplication.run(MovieHystrixApplication.class, args);
    }
	
	@Bean
	@LoadBalanced
	public RestTemplate restTemplate(){
		return new RestTemplate();
	}
}
